import pandas as pd
class PromptBuilder:
    def __init__(self, df, explanations, conversation_history, user_input):
        self.df = df
        self.explanations = explanations
        self.conversation_history = conversation_history
        self.user_input = user_input

    def build_prompt(self):
        """构建最终的提示词，包含意图识别和代码生成的逻辑。"""
        prompt_parts = [
            self._build_conversation_history(),
            self._build_context(),
            self._build_examples(),
            self._build_explanations(),
            self._build_user_query(),
            self._build_task_instructions()
        ]
        return "\n".join(prompt_parts)
    
    def build_summary_prompt(self, result_str, generated_code=None):
        """构建用于生成查询结果总结的提示词。"""
        prompt = (
            f"背景信息：\n"
            "用户提出了一个查询问题，模型生成了相应的代码来处理数据，并根据代码执行结果生成了查询结果。请注意，以下内容展示了整个过程的详细步骤。\n\n"
            f"用户提问：\n'{self.user_input}'\n\n"
        )
        
        if generated_code:
            prompt += (
                "模型根据用户的提问和数据表中的信息生成了以下代码：\n"
                f"```python\n{generated_code}\n```\n\n"
            )
        
        prompt += (
            "执行上述代码后，得到了以下查询结果：\n"
            f"{result_str}\n\n"
            "请按照以下结构，用中文总结该查询结果：\n"
            "1. **结果概述**：\n" 
            "   - 对查询结果进行简洁明了的概述。\n"
            "2. **数据解释**：\n"
            "   - 详细解释查询结果的每一部分，指出数据的关键点和趋势。\n"
            "   - 如果查询涉及对比或分组，请解释不同组之间的差异。\n"
            "3. **潜在影响**：\n"
            "   - 说明结果可能的商业或决策影响，指出结果可能带来的机会或风险。\n"
            "4. **建议**：\n"
            "   - 基于结果，提出可能的后续行动或进一步的分析方向。\n"
            "5. **其他信息**：\n"
            "   - 如有必要，可以提供额外的上下文或背景信息，帮助理解结果。\n"
            "请注意，在解释时避免使用技术术语，确保内容易于理解。"
        )
        
        return prompt





    def _build_conversation_history(self):
        """生成对话历史部分的提示词。"""
        return f"Conversation History:\n{self.conversation_history}\n"

    def _build_column_value_info(self, df):
        """生成每列数据的描述信息"""
        column_info = []
        for column in df.columns:
            if pd.api.types.is_numeric_dtype(df[column]):
                col_min = df[column].min()
                col_max = df[column].max()
                column_info.append(f"{column} (数值): 最小值 = {col_min}, 最大值 = {col_max}")
            elif pd.api.types.is_categorical_dtype(df[column]) or df[column].dtype == object:
                unique_values = df[column].unique()
                if len(unique_values) > 5:
                    unique_values = unique_values[:5]
                column_info.append(f"{column} (类别): 可能的值 = {', '.join(map(str, unique_values))}")
            else:
                column_info.append(f"{column} (其他类型)")
        
        return "\n".join(column_info)

    def _build_context(self):
        """生成数据上下文部分的提示词。"""
        column_info = self._build_column_value_info(self.df)
        return (
            f"DataFrame 'df' 包含以下列: {', '.join(self.df.columns)}。\n"
            f"列值信息:\n{column_info}\n"
            "基于对话历史和以下用户输入，确定用户的意图。"
        )

    def _build_examples(self):
        """生成示例部分的提示词。"""
        return (
            "如果用户输入是一个需要进行数据处理或分析的查询，生成操作 DataFrame 的 Python 代码。\n"
            "如果用户输入是请求数据总结、解释或不需要执行代码的跟进问题，请以自然语言回答。\n"
            "确保如果生成代码，最终结果被赋值给名为 'result' 的变量。\n\n"
            "示例:\n"
            
            # 示例 1: 数据查询
            "1. 用户输入: '请展示 2023 年的总销售额。'\n"
            "   模型响应: 'code'\n"
            "   生成代码:\n"
            "   ```python\n"
            "   result = df[df['year'] == 2023]['sales'].sum()\n"
            "   ```\n\n"
            
            # 示例 2: 行数据查询
            "2. 用户输入: '请展示表格中的前五行数据。'\n"
            "   模型响应: 'code'\n"
            "   生成代码:\n"
            "   ```python\n"
            "   result = df.head(5)\n"
            "   ```\n\n"
            
            # 示例 3: 列解释
            "3. 用户输入: '请解释一下销售额这一列的含义。'\n"
            "   模型响应: 'no_code'\n"
            "   生成解释: '销售额这一列表示以美元计算的总销售额。'\n\n"
            
            # 示例 4: 数据筛选
            "4. 用户输入: '请展示年龄在30岁以上的男性数据。'\n"
            "   模型响应: 'code'\n"
            "   生成代码:\n"
            "   ```python\n"
            "   result = df[(df['gender'] == 'male') & (df['age'] > 30)]\n"
            "   ```\n\n"
            
            # 示例 5: 数据分布查询
            "5. 用户输入: '描述一下数据集中教育水平的分布情况。'\n"
            "   模型响应: 'code'\n"
            "   生成代码:\n"
            "   ```python\n"
            "   result = df['education'].value_counts().sort_index()\n"
            "   ```\n"
        )

    def _build_explanations(self):
        """生成术语解释部分的提示词。"""
        if not self.explanations:
            return "No explanations available."
        
        explanation_text = "\n术语解释:\n"
        for term, explanation in self.explanations.items():
            explanation_text += f"- {term}: {explanation}\n"
        return explanation_text

    def _build_user_query(self):
        """生成用户输入部分的提示词。"""
        return f"用户输入: {self.user_input}"

    def _build_task_instructions(self):
        """生成最后的任务指令部分的提示词。"""
        return (
            "基于上述内容，选择生成 'code' 如果需要生成 Python 代码，否则选择 'no_code' 来进行自然语言回复。"
            "如果是 'code'，请跟随生成的 Python 代码块。如果是 'no_code'，请提供自然语言响应。"
        )


